package com.seed.application.gateway.impl;

import com.seed.application.Sa;
import com.seed.application.gateway.SeedGateway;
import com.seed.core.RequestWrapper;
import com.seed.core.ResponseWrapper;
import com.seed.core.pojo.R;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 1. 白名单地址
 * 2. 配置地址(所有服务都有，不能被覆盖，适用于一切http请求方法)
 * 3. 保留地址(所有服务都有，不能被覆盖)
 * 4. uaa地址(主应用服务才有，不能被覆盖)
 * 5. 库地址(引用了库的服务就有，不能被覆盖)
 * 6. 幽灵地址(最后的保障)
 */
@Slf4j
public class MicroSeedGateway implements SeedGateway {

    protected RequestWrapper request;
    protected ResponseWrapper response;

    /**
     * 单体应用：地址以应用名称或微服务名称开头，该类型的应用不能有属于自己的controller，如果需要自定义，则需要先定义成库，再引用
     * 请应用请求形如：/~/action, /~/seed/action, /~/seed/action/pathVariable
     * 微服务请求形如：/micro/action, /micro/seed/action, /micro/seed/action/pathVariable
     * app和micro后置处理
     */
    @Override
    public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
        this.request = new RequestWrapper(req);
        this.response = new ResponseWrapper(res);

        if("/".equals(req.getRequestURI())) { //2. 配置地址(所有服务都有)
            response.sendJSON(R.data(Sa.getConfiguration().toFront()));
        } else {
            Sa.switchDataSourceKey();
            chain.doFilter(req, res);
        }
    }
}
